package bbalgae_JavaJDBC;

import java.util.ArrayList;
import java.util.List;

public class J04_Collection {

	/*
	 * 콜렉션 객체지향 기반 프로그램 작성시 종종 같은 종류의 객체의 묶음이나 다른종류 객체 묶음과 함께 쓰는때가있음 앞서 배운 배열은
	 * 같은 종류의 객체 묶음이지만 유연성이 부족하고, 크기조정도 안되고 다른종류의 객체를 가질 수 없음 다행히 자바에는 이러한 종류의
	 * 객체를 쉽게 다룰 수 있도록 인터페이스와 클래스를 제공 그것은 바로 Collection 프레임워크임 대부분 java.utill
	 * 패키지에 포진해 있음.
	 * 
	 * Collection 다른 종류로 구성된 객체들의 묶음을 의미 또 다른 말로 용기 container 하는데 각 요소를
	 * 저장,검색,조작하는 메소드를 제공
	 * 
	 * Collection <- Set,List,Queue List <- ArrayList Map <- AbstractMap,
	 * SortedMap AbstractMap<-HashMap Iterator, Comparator
	 * 
	 * 이들 대부분은 java.utill 패키지에 포함됨
	 * 
	 * List - 동적배열 Collection 가장 인기있는 하위 인터페이스임 ArrayList는 List의 가장 자주사용하는 구현
	 * 클래스 List 자료를 순서대로 저장하는 특성을 가짐 FIFO : first in first out 또한 데이터를 중복으로
	 * 저장가능 단 set 중복허용 불가 add 통해 데이터를 List 맨끝에 추가
	 
	 * generic
	 * Collection 배울때 generic 빼놓으면불완전하게 collection 배우는 것임
	 * Collection 사용할때 발생할 수 있는 컴파일시간 엄격한 자료형을 검사 
	 * 또한, collection을 다룰때 대부분의 downcasting을 제거하고 사용할 수있음
	 * 또한, C++에서 제공하는 클래스 템플릿을 작성할 수 있게 해줌 (고급)
	 * 제네릭에서는 매개변수 자료형 parameterized type을 이용해서 collection 요소의 자료형을 지정	함
	 * 메소드의 매개변수는 ()안에 사용하는 것처럼 collection에서는 <>안에 매개변수 자료형을 사용
	 *	List<String> result = null;
	 * 
	 */

	public static void main(String[] args) {

		List a = new ArrayList();
		a.add(1111);
		a.add("asdf");
		a.add(123.34);
		a.add(new J03_MemberVO());
		// System.out.println(a);

		// ArrayList에 저장된 객체를 하나씩 꺼내 출력
		// 변수에 따로 저장
		// 이유 : 대상이 무엇이든 간에 무조건 Obejct형으로 저장됨. 따라서, ArrayList에 저장된 객체를 꺼낼때는
		// 객체의 자료형에 맞춰 downcasting이 필요
		/*
		 * System.out.println(a.get(0)); System.out.println(a.get(1));
		 * System.out.println(a.get(2)); System.out.println(a.get(3));
		 
		int num = (int) a.get(0);
		String chr = (String) a.get(1);
		float floatnum = (float) a.get(2);

		System.out.println(num);
*/
		// 하지만 이렇게해도오류는 x
		//실행하면 비로소 오류가 뜸
		// 이런 종류의 오류는 찾기가 힘듦
		
	//	char num2 = (char) a.get(0); // int 인 자료에 char로 넣음
		//Integer intg = (Integer) a.get(3); // Stiring 자료에 int로 넣음 그러니 컴파일 실행시
											// 오류가발생

		//지네릭을 사용했을 경우
		List<String> abc = new ArrayList<>();
		//abc 라는 콜렉션(동적배열)에는 STring 형식의 값만 추가할 수 있다는 의미 
		abc.add("가나다라");
		//abc.add(123); 오류발생
		//abc.add('a'); 오류발생
		
		String xyz=abc.get(0); //형변환은 필요 없음
		
		System.out.println(abc);
		
		List<J03_MemberVO> results = new ArrayList<>(); //안에 잇는 값만 사용할수 있음.
		
		
	}

}
